/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package fr.ove.openmath.jome.ctrlview.bidim;

/**
 *
 * @author Mr.Sam
 */
import java.awt.*;
import fr.ove.openmath.jome.ctrlview.bidim.DisplayLayout;
import fr.ove.openmath.jome.ctrlview.bidim.Display;
import fr.ove.openmath.jome.ctrlview.bidim.Bar;
import fr.ove.openmath.jome.ctrlview.bidim.selection.events.SelectionEvent;
import fr.ove.openmath.jome.model.*;
import fr.ove.utils.FontInfo;

/**
* A layout manager that lays components to be displayed as a fraction.
*
* @author © 1999 DIRAT Laurent
* @version 2.0 15/12/1999
*/
public class FractionLayout extends BetweenOperatorLayout {
    /**
    * Computes the size of the display according to its children size (if any),
    * and its different attributes.
    * @return the size of the display.
    */
    public Dimension computeAttributes() {
        SymbolDisplay displayBar = null;
        Bar fractionBar = null;
        
        updateLevel(displayToLay.getLevel());
        
        // On est dans le cas particulier d'un symbol qui ne connait pas sa taille à l'avance.
        // Pour que cela puisse fonctionner correctement avec les autres displays, il faut qu'on
        // lui precise sa preferred size.
        // On met sa longueur à 0 pour éviter les élargissements infinis lors des différents retaillages
        // dus aux désiconifications. (On rajoute 8 pixels à sa largeur un peu plus bas)
        displayBar = (SymbolDisplay) displayToLay.getComponent(0);
        displayBar.setWidth(0);
        fractionBar = (Bar) displayBar.getSymbol();
        fractionBar.setWidth(0);
        
        fractionBar.setHeight(FontInfo.getLineThickness(displayToLay, displayToLay.getFont())); // la hauteur fixe aussi ascent et descent
        
        displayBar.setComputeAttributes(true);
    
        // On calcule les attributs des display enfants comme si 
        // on avait affaire à un VerticalCenteredLayout
        Dimension dim = super.computeAttributes(); 
        
        // La différence réside en le calcul supplémentaire de la taille de la 
        // de fraction que l'on ne peut fixer après avoir calculé la largeur
        // du numérateur et du dénominateur
        fractionBar.setWidth(dim.width + 8);
        displayBar.setSize(fractionBar.getSize());
        
        dim.width = displayBar.getWidth();
        displayToLay.setSize(dim);
        
        return dim;
    }
    
    /**
    * Returns the display of the operator
    */
    public Display createOperatorDisplay() {
        SymbolDisplay fractionBar = new SymbolDisplay(displayToLay.getGraphicContext(), new Bar());
        // Le display de la barre de fraction est le display d'un opérateur (on peut le considérer comme tel)
        fractionBar.setIsSymbolOperatorDisplay(true);
        
        return fractionBar;
    }    
}

